package com._54programer.rabbitmq.ack;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class AckConsumer {

    @RabbitListener(queues = "simple_queue")
    public void testListener(Message message, Channel channel) throws IOException {

        /**
         * 确认消息
         * deliveryTag（唯一标识 ID）：当一个消费者向 RabbitMQ 注册后，会建立起一个 Channel ，RabbitMQ 会用 basic.deliver 方法向消费者推送消息，这个方法携带了一个 delivery tag， 它代表了 RabbitMQ 向该 Channel 投递的这条消息的唯一标识 ID，是一个单调递增的正整数，delivery tag 的范围仅限于 Channel
         * multiple：为了减少网络流量，手动确认可以被批处理，当该参数为 true 时，则可以一次性确认 delivery_tag 小于等于传入值的所有消息
         */
        //channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

        //否认消息, 消息会重新回到队列重新被消费
        //false: 是否是批量的
        //true: 是否重回队列
        //channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);

        //拒绝消息, 消息会被丢弃，不会回到队列
        //channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
        System.out.println(new String(message.getBody()));

    }

}
